assume cs: code, ds: data
data segment
           dw 0, 0, 0, 0, 0, 0, 0, 0      ;临时创建8个字空间

      X    dw 1fffh
      Y    dw 0eeeh
      M    dw 0011h
      N    dw 0022h
      D    dw 10h
      G    dw 0                           ; 保存商
      R    dw 0                           ; 保存余数
data ends
;计算 (X+Y-M*N)/(D+6)
code segment
      start:
            mov ax, data
            mov ds,ax
      ;先计算乘法
            mov ax, M           ;
            mov bx, N           ;
            mul bx              ; 用bx里的东西成ax,乘积高8位放dx,低8位放ax
            mov ds:[0], dx      ; dx中存高16位
            mov ds:[2], ax      ; ax中存低16位

      ; 再计算加法
            mov ax, X           ;
            mov bx, Y           ;

      ;其实下面两行直接 add ax, bx就ok
            add al, bl          ; 低字节直接相加, al中为低位结果
            adc ah, bh          ; 高字节进位相加, ah中为高位结果
      ; 此时ah中存有高位结果，al中存低位结果

      ; 算减法
            cwd                 ; 把字型数据扩展为双字型数据
      ;若AX最高位=1，则执行后DX=FFFFH,若AX最高位=0，则执行后DX=0000H

      ;此时dx存着ax的扩展后的ax高八位
            sub ax, ds:[2]
            sbb dx, ds:[0]

      ; 最后算除法

            mov bx, D
            add bx, 6

      ;此时被除数32位,高8位在dx,低8位在ax
            div bx
      ;此时dx存着余数，ax存着商

            mov G, ax           ; G存商
            mov R, dx           ; R存余数

            mov ax, 4c00H
            int 21h

code ends
end start
